

import bpy

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import Core.bl_UI配色 as UI配色

import engine.initLIB.load_dll as engineLib
import ctypes


engineLib.flexCAPI.f_创建修改器取粒子节点.restype = ctypes.c_bool
engineLib.flexCAPI.f_创建修改器置粒子数据节点.restype = ctypes.c_bool












class C_Node_修改器_取粒子(基类.C_SN_基类):
	bl_dname = 'bl_node_修改器_取粒子'
	bl_label = '修改器_取粒子'
	
	m_修改器名称 = bpy.props.StringProperty(name="修改器名称", default='ParticleSettings')
	def init(self, context):
		super(C_Node_修改器_取粒子, self).f_init(context)

		self.inputs.new('C_Socket_Vec3_Array1D', name='位置')
		self.inputs.new('C_Socket_F32_Array1D', name='大小')
		self.inputs.new('C_Socket_F32_Array1D', name='出生')
		self.inputs.new('C_Socket_F32_Array1D', name='年龄')


	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_修改器名称', icon='PARTICLE_DATA')

	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建修改器取粒子节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.inputs['位置'].f_update()
			self.inputs['大小'].f_update()
			self.inputs['出生'].f_update()
			self.inputs['年龄'].f_update()








class C_Node_修改器_置粒子数据(基类.C_Node_基类):
	bl_dname = 'bl_node_修改器_设置粒子数据'
	bl_label = '修改器_设置粒子数据'
	
	m_Object = bpy.props.PointerProperty(type=bpy.types.Object)
	m_Particle = bpy.props.StringProperty()
	def init(self, context):
		super(C_Node_修改器_置粒子数据, self).f_init(context)
		self.inputs.new('C_NodeSocket_粒子', name='粒子系统')
		#self.inputs.new('C_Socket_I32', name='数量')
		self.inputs.new('C_Socket_iVec2', name='索引')

		self.inputs.new('C_Socket_Vec3_Array1D', name='位置')
		self.inputs.new('C_Socket_Vec4_Array1D', name='旋转')
		self.inputs.new('C_Socket_F32_Array1D', name='大小')
		self.inputs.new('C_Socket_F32_Array1D', name='出生')
		self.inputs.new('C_Socket_F32_Array1D', name='年龄')
		
		self.f_toCPP()
		
	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建修改器置粒子数据节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.inputs['索引'].f_update()
			self.inputs['位置'].f_update()
			self.inputs['旋转'].f_update()
			self.inputs['大小'].f_update()
			self.inputs['出生'].f_update()
			self.inputs['年龄'].f_update()


	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_Object', icon='PARTICLE_DATA')
		if self.m_Object :
			#layout.template_search(self, 'm_Particle', self.m_Object, 'particle_systems')
			layout.prop_search(self, "m_Particle", self.m_Object, "particle_systems")
			
		#layout.prop(self, 'm_Particle', icon='PARTICLE_DATA')

	def update(self):
		if self.m_Object :
			self.inputs['粒子系统'].hide = True
		else :
			self.inputs['粒子系统'].hide = False

		
	

	def f_update(self):
		#粒子位置 = self.inputs['位置'].f_getData()
		#粒子旋转 = self.inputs['旋转'].f_getData()
		#出生 = self.inputs['出生'].f_getData()
		#年龄 = self.inputs['年龄'].f_getData()
		data = engineLib.flexCAPI.f_取节点数据(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name));
		
		if self.m_Particle :
			obj = 基类.getEvaluatedObject(self.m_Object)
			ps = obj.particle_systems[self.m_Particle]
			if ps == None : return
			
			区间 = data[0]
			l = data[1]
			v = data[2]
			r = data[3]
			s = data[4]

			lNum = len(l)
			vNum = len(v)
			rNum = len(r)
			sNum = len(s)

			if lNum == 0 or vNum == 0 or rNum == 0 or sNum == 0 : return
			

			坐标独立 = lNum >= 区间[1]
			速度独立 = vNum >= 区间[1]
			旋转独立 = rNum >= 区间[1]
			大小独立 = sNum >= 区间[1]

			print(self.name + '=== : ', data, self.m_Particle)
			for i in range(区间[0], 区间[1]):
				if 坐标独立 :
					ps.particles[i].location = l[i]
				else:
					ps.particles[i].location = l[0]

				ps.particles[i].velocity = (0.0,0.0,0.0)

				if 旋转独立 :
					ps.particles[i].rotation = r[i]
				else:
					ps.particles[i].rotation = r[0]

				if 大小独立 :
					ps.particles[i].size = s[i]
				else:
					ps.particles[i].size = s[0]
				
				ps.particles[i].birth_time = 0.0
				ps.particles[i].die_time = 0.0
				ps.particles[i].lifetime = 1000.0

			ps.particles.update()

		
class C_NODE_MENU_修改器置粒子数据(bpy.types.Operator):
	bl_idname = 'node.global_node_set_bl_particle_data'
	bl_label = '修改器_设置粒子数据'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_修改器_置粒子数据', use_transform=True)
		return {'FINISHED'}



















classes = (

	C_Node_修改器_置粒子数据,
	C_NODE_MENU_修改器置粒子数据,
	
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)



